//
//  main.m
//  Block基本使用
//
//  Created by wenjim on 17/10/13.
//  Copyright © 2017年 WenJim. All rights reserved.
//

#import <Foundation/Foundation.h>

void printRose(int num)
{
    for (int i = 0; i < num; i++) {
        printf("  {@} \n");
        printf("   ｜ \n");
        printf("  \\｜/ \n");
        printf("   ｜ \n");

    }
    
}

int sum (int value1,int value2)
{
    printf("%i + %i = %i\n",value1,value2,value1 + value2);
    return value1 + value2;
}

int main(int argc, const char * argv[]) {
    
    /*
    printf("  {@} \n");
    printf("   ｜ \n");
    printf("  \\｜/ \n");
    printf("   ｜ \n");
    */
    
    /*
//    printRose();
//    printRose();
    
    
    
    // void 代表指向的函数没有返回值
    // () 代表指向的函数没有形参
    // (*roseP) 代表roseP是一个指向函数的指针
//    void (*roseP)  ();
//    roseP = printRose;
//    roseP();
    
    
    // 定义一个block变量
    // block和函数一样，可以没有返回值，也没有形参
    // 也可以没有返回值有形参
    // 也可以有返回值没有形参
    // 也可以有返回值有形参
    // 所以 在定义一个block变量的时候，也需要告诉该变量将来保存的代码有没有返回值和形参
    
    // void 代表block 将来保存的代码没有返回值
    // () 代表block将来保存的代码没有形参
    // (^roseBlock) 代表roseBlock 是一个block变量，可以用于保存一段block代码
    void (^roseBlock) ();
     // 如果block没有参数，那么 ^ 后面的()可以省略
    roseBlock = ^{
        printf("  {@} \n");
        printf("   ｜ \n");
        printf("  \\｜/ \n");
        printf("   ｜ \n");
    };
    
    // 要想执行block保存的代码，必须调用block才会执行
    roseBlock();
     */
    
    /*
//    void (*roseP) (int);
//    roseP = printRose;
//    roseP(2);
    
    void (^roseBlock) (int);
    roseBlock = ^(int num){
    
        for (int i = 0; i < num; i ++) {
            printf("  {@} \n");
            printf("   ｜ \n");
            printf("  \\｜/ \n");
            printf("   ｜ \n");
        }
    };
    roseBlock(3);
    */
    
    /*
    int (*sumP) (int ,int);
    sumP = sum;
    sumP(3,5);
    
    
   int (^sumBlock) (int,int);
    sumBlock = ^(int value,int value2){
        
        NSLog(@"%i + %i = %i",value,value2,value + value2);
        
        return value + value2;
        
    };
    sumBlock(20,30);
    
    
    int (^sumBlock2)(int,int) = ^(int value,int value2){
        NSLog(@"%i + %i = %i",value,value2,value + value2);
        
        return value + value2;
    };
    
    sumBlock2(20,30);
    */
    
    
    // blcok是一种数据类型
    void (^numBlock)(int) = ^(int num){
    
        for (int i = 0; i < num;  i ++) {
            printf("----------\n");
            printf("----------\n");
            printf("----------\n");
            
        }
    };
    
    numBlock(2);
    
    
//    int a = 10;
//    int b;
//    b = 20;
    
    return 0;
}
